// 登录云函数
"use strict";

const db = uniCloud.database();
const usersCollection = db.collection("users");
const crypto = require("crypto");
const jwt = require("jsonwebtoken");

// 密码验证函数
function verifyPassword(password, storedHash, storedSalt) {
  const hash = crypto
    .pbkdf2Sync(password, storedSalt, 1000, 64, "sha512")
    .toString("hex");
  return hash === storedHash;
}

// 生成JWT Token
function generateToken(userId, username, role) {
  // 这里使用简单的密钥，实际项目中应该使用更安全的密钥
  const secret = "walking-b-admin-secret-key";
  // Token有效期设为1天
  const expiresIn = 60 * 60 * 24;

  return jwt.sign({ userId, username, role }, secret, { expiresIn });
}

exports.main = async (event, context) => {
  try {
    const { username, password } = event;

    // 参数验证
    if (!username || !password) {
      return {
        code: -1,
        message: "用户名和密码不能为空",
      };
    }

    // 查询用户
    const userResult = await usersCollection
      .where({
        username,
        user_type: "admin", // 只允许后台管理员类型的用户登录
      })
      .get();

    const user = userResult.data && userResult.data[0];

    // 用户不存在
    if (!user) {
      return {
        code: -2,
        message: "用户不存在，请初始化管理员账号",
      };
    }

    // 用户被禁用
    if (user.status !== 1) {
      return {
        code: -3,
        message: "账号已被禁用，请联系管理员",
      };
    }

    // 验证密码
    const isPasswordValid = verifyPassword(
      password,
      user.password_hash,
      user.password_salt
    );

    if (!isPasswordValid) {
      return {
        code: -4,
        message: "密码错误",
      };
    }

    // 生成Token
    const token = generateToken(user._id, user.username, user.role);

    // 更新最后登录时间
    await usersCollection.doc(user._id).update({
      last_login_date: Date.now(),
    });

    // 返回用户信息和Token（不包含密码相关信息）
    const userInfo = {
      _id: user._id,
      username: user.username,
      nickname: user.nickname,
      role: user.role,
      status: user.status,
      register_date: user.register_date,
      last_login_date: Date.now(),
    };

    return {
      code: 0,
      message: "登录成功",
      data: {
        token,
        userInfo,
      },
    };
  } catch (error) {
    console.error("登录失败:", error);
    return {
      code: -1,
      message: "登录失败: " + error.message,
    };
  }
};
